/**
 * 研发项目版本控制业务逻辑
 */
// 使用统一配置入口模式导入模块
const ProjectHelpers = require('../../../config/project_helpers_config');
const { cloudHelper, pageHelper } = ProjectHelpers;
const { ResearchProjectResourceModel, ResearchProjectModel } = require('../../../config/models_config');

// 将类形式改为对象形式
const ProjectVersionBiz = {

	/**
	 * 创建资源版本
	 * @param {Object} versionData 版本数据
	 * @returns {Promise} 异步结果
	 */
	async createResourceVersion(versionData) {
		if (!versionData) return null;

		try {
			return await cloudHelper.callCloudData('research_project/version_create', versionData);
		} catch (err) {
			console.error('创建资源版本失败', err);
			return null;
		}
	},

	/**
	 * 获取资源版本列表
	 * @param {String} resourceId 资源ID
	 * @returns {Promise} 异步结果
	 */
	async getResourceVersionList(resourceId) {
		if (!resourceId) return [];

		try {
			const params = {
				resourceId
			};

			return await cloudHelper.callCloudData('research_project/version_list', params);
		} catch (err) {
			console.error('获取资源版本列表失败', err);
			return [];
		}
	},

	/**
	 * 获取资源类型选项
	 * @returns {Array} 资源类型选项
	 */
	getResourceTypeOptions() {
		const options = [];
		
		for (const key in ResearchProjectResourceModel.RESOURCE_TYPE) {
			if (ResearchProjectResourceModel.RESOURCE_TYPE.hasOwnProperty(key)) {
				const value = ResearchProjectResourceModel.RESOURCE_TYPE[key];
				const label = ResearchProjectResourceModel.RESOURCE_TYPE_NAME[value];
				
				options.push({
					value,
					label
				});
			}
		}
		
		return options;
	},

	/**
	 * 获取版本状态选项
	 * @returns {Array} 版本状态选项
	 */
	getVersionStatusOptions() {
		const options = [];
		
		for (const key in ResearchProjectResourceModel.VERSION_STATUS) {
			if (ResearchProjectResourceModel.VERSION_STATUS.hasOwnProperty(key)) {
				const value = ResearchProjectResourceModel.VERSION_STATUS[key];
				const label = ResearchProjectResourceModel.VERSION_STATUS_NAME[value];
				
				options.push({
					value,
					label
				});
			}
		}
		
		return options;
	},

	/**
	 * 生成版本号
	 * @param {string} prefix 前缀
	 * @param {number} major 主版本号
	 * @param {number} minor 次版本号
	 * @param {number} patch 修订版本号
	 * @returns {string} 版本号
	 */
	generateVersionNumber(prefix, major, minor, patch) {
		return `${prefix || 'v'}${major || 1}.${minor || 0}.${patch || 0}`;
	},

	/**
	 * 解析版本号
	 * @param {string} version 版本号
	 * @returns {Object} 解析结果
	 */
	parseVersionNumber(version) {
		if (!version) return null;
		
		// 匹配版本号格式：v1.2.3 或 1.2.3
		const regex = /^(v?)(\d+)\.(\d+)\.(\d+)$/;
		const match = version.match(regex);
		
		if (!match) return null;
		
		return {
			prefix: match[1],
			major: parseInt(match[2]),
			minor: parseInt(match[3]),
			patch: parseInt(match[4])
		};
	},

	/**
	 * 比较版本号
	 * @param {string} version1 版本号1
	 * @param {string} version2 版本号2
	 * @returns {number} 比较结果：1表示version1大，-1表示version2大，0表示相等
	 */
	compareVersions(version1, version2) {
		const v1 = this.parseVersionNumber(version1);
		const v2 = this.parseVersionNumber(version2);
		
		if (!v1 || !v2) return 0;
		
		if (v1.major > v2.major) return 1;
		if (v1.major < v2.major) return -1;
		
		if (v1.minor > v2.minor) return 1;
		if (v1.minor < v2.minor) return -1;
		
		if (v1.patch > v2.patch) return 1;
		if (v1.patch < v2.patch) return -1;
		
		return 0;
	},

	/**
	 * 获取下一个版本号
	 * @param {string} currentVersion 当前版本号
	 * @param {string} type 版本类型：major, minor, patch
	 * @returns {string} 下一个版本号
	 */
	getNextVersion(currentVersion, type = 'patch') {
		const version = this.parseVersionNumber(currentVersion);
		
		if (!version) {
			return this.generateVersionNumber('v', 1, 0, 0);
		}
		
		const { prefix, major, minor, patch } = version;
		
		switch (type) {
			case 'major':
				return this.generateVersionNumber(prefix, major + 1, 0, 0);
			case 'minor':
				return this.generateVersionNumber(prefix, major, minor + 1, 0);
			case 'patch':
			default:
				return this.generateVersionNumber(prefix, major, minor, patch + 1);
		}
	},

	/**
	 * 获取项目资源版本列表
	 * @param {String} projectId 项目ID
	 * @returns {Promise} 异步结果
	 */
	async getProjectResourceVersionList(projectId) {
		if (!projectId) return null;
		
		try {
			const params = {
				projectId
			};
			
			return await cloudHelper.callCloudData('research_project/resource_list', params);
		} catch (err) {
			console.error('获取项目资源版本列表失败', err);
			return null;
		}
	},

	/**
	 * 添加资源版本
	 * @param {String} resourceId 资源ID
	 * @param {Object} versionData 版本数据
	 * @returns {Promise} 异步结果
	 */
	async addResourceVersion(resourceId, versionData) {
		if (!resourceId || !versionData) return null;

		try {
			const params = {
				resourceId,
				...versionData
			};

			return await cloudHelper.callCloudData('research_project/version_add', params);
		} catch (err) {
			console.error('添加资源版本失败', err);
			return null;
		}
	},

	/**
	 * 获取资源版本详情
	 * @param {String} versionId 版本ID
	 * @returns {Promise} 异步结果
	 */
	async getResourceVersionDetail(versionId) {
		if (!versionId) return null;

		try {
			const params = {
				id: versionId
			};

			return await cloudHelper.callCloudData('research_project/version_detail', params);
		} catch (err) {
			console.error('获取资源版本详情失败', err);
			return null;
		}
	},

	/**
	 * 删除资源版本
	 * @param {String} versionId 版本ID
	 * @returns {Promise} 异步结果
	 */
	async deleteResourceVersion(versionId) {
		if (!versionId) return false;

		try {
			const params = {
				id: versionId
			};

			await cloudHelper.callCloudData('research_project/version_delete', params);
			return true;
		} catch (err) {
			console.error('删除资源版本失败', err);
			return false;
		}
	},

	/**
	 * 检查是否可以添加资源版本
	 * @param {Object} project 项目对象
	 * @returns {boolean} 是否可以添加
	 */
	canAddResourceVersion(project) {
		if (!project) return false;
		
		const status = project.STATUS || 0;
		// 只有特定状态的项目可以添加资源版本
		const allowedStatus = [
			ResearchProjectModel.STATUS.DEVELOPMENT, 
			ResearchProjectModel.STATUS.TESTING,
			ResearchProjectModel.STATUS.RELEASED
		];
		
		return allowedStatus.includes(status);
	},

	/**
	 * 获取最新版本
	 * @param {Array} resourceVersions 资源版本列表
	 * @returns {Object} 最新版本
	 */
	getLatestVersion(resourceVersions) {
		if (!resourceVersions || resourceVersions.length === 0) return null;
		
		let latest = resourceVersions[0];
		
		for (let i = 1; i < resourceVersions.length; i++) {
			const version = resourceVersions[i];
			if (this.compareVersions(version.version, latest.version) > 0) {
				latest = version;
			}
		}
		
		return latest;
	}
};

module.exports = ProjectVersionBiz; 